home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat23 / newlook / newlook.c < prev    next >
C/C++ Source or Header  |  1993-01-10  |  8KB  |  278 lines

  1. /************************************************************************/
  2. /*                                                                        */
  3. /* Pouquoi utiliser NEWLOOK ?                                            */
  4. /*                                                                         */
  5. /* Si vous utilisez un Amiga doté du système 2.0 vous avez certainement    */
  6. /* été déçu par l'aspect des écrans qu'ouvrent les applications conçues    */
  7. /* pour tourner sous système 1.2 ou 1.3 . Ces écrans n'offrent pas        */
  8. /* de relief comme sur l'écran WorkBench !                                */
  9. /* Aprés avoir lancé NEWLOOK vous bénéficirez de cet aspect en relief    */
  10. /* même pour d'anciennes applications.                                    */
  11. /*                                                                        */
  12. /* La methode utilisée est d'intercepter tous les appels à OpenScreen()    */
  13. /*  d'ajouter les paramètres nécessaires à la structure NewScreen pour    */
  14. /*  ouvrir un écran newlook 2.0 , et de passer effectivement cette        */
  15. /*  nouvelle structure à OpenScreen() .                                    */
  16. /*                                                                        */
  17. /*  ( ce programme ne fonctionne que sous system >= 2.0 ! )                */
  18. /*                                                                        */
  19. /*        Rémy LEBIGUE                                                     */
  20. /*        24, rue Ste Geneviève                                             */
  21. /*        54600 Villers les Nancy                                            */
  22. /*                                                                        */
  23. /*        1993                                                            */
  24. /*                                                                        */
  25. /************************************************************************/
  26.  
  27.  
  28. /* #include < voir preinclude.c > */
  29.  
  30.  
  31. /**********************************************************/
  32.  
  33. struct IntuitionBase    *    IntuitionBase        ;
  34. extern struct ExecBase    *    SysBase                ;
  35. void                        main(void)            ;
  36.  
  37. /* Déclaration de la fonction qui remplacera OpenScreen() */
  38.  
  39. void                         newlookopenscreen()    ; 
  40.  
  41. /***********************************************************/
  42.  
  43. /* "DrawInfo Pens" indispensables pour un rendu de type "NewLook" " */
  44.  
  45. static UWORD    dri_Pens[] = { 0, 1, 1, 2, 1, 3, 1, 0, 3, ~0}    ;
  46.  
  47. /* dri_Pens[0] -> detailPen            */
  48. /* dri_Pens[1] -> blockPen            */
  49. /* dri_Pens[2] -> textPen            */
  50. /* dri_Pens[3] -> shinePen            */
  51. /* dri_Pens[4] -> shadowPen            */
  52. /* dri_Pens[5] -> hifillPen            */
  53. /* dri_Pens[6] -> hifilltextPen        */
  54. /* dri_Pens[7] -> backgroundPen        */
  55. /* dri_Pens[8] -> hilighttextPen    */
  56.  
  57. /* Variable globale de sauvegarde de l'adresse de OpenScreen() */
  58.  
  59. APTR  oldopenscreen        ;
  60.  
  61. /***********************************************************/
  62.  
  63. void main(void)
  64. {
  65.     struct NewWindow        newwindow    ;
  66.     struct Window        *    window        ;
  67.     struct IntuiMessage *    msg            ;
  68.  
  69. /* Ouvre Intuition version >= V36 pour s'assurer que l'on utilise l'OS 2.0 */
  70.  
  71.     if (IntuitionBase = (struct IntuitionBase *) 
  72.                         OpenLibrary((UBYTE*)"intuition.library",(long)36))
  73.     {
  74.  
  75.         Forbid() ; /* Arrêt de la commutation de tâche */
  76.  
  77.     /* Remplace la fonction OpenScreen (offset -198) par newlookopenscreen */
  78.  
  79.         oldopenscreen = SetFunction((struct Library *) IntuitionBase,
  80.                         (long)-198,(void*) &newlookopenscreen)    ;        
  81.  
  82.         Permit() ; /* Reprise de la commutation de Tâche */
  83.     
  84.     /*    Prépare une fenêtre de contrôle */
  85.  
  86.            newwindow.LeftEdge    = 0    ;
  87.            newwindow.TopEdge    = 0    ;
  88.            newwindow.Width        = 12 * (IntuitionBase->FirstScreen->BarHeight)    ;
  89.            newwindow.Height    = IntuitionBase->FirstScreen->BarHeight        ;
  90. /* ( Intuition->FirstScreen pointe sur l'écran WorkBench )    */
  91.  
  92.            newwindow.DetailPen    = 0    ;
  93.            newwindow.BlockPen    = 1    ;
  94.  
  95.     /* intuition ne fera parvenir que les messages  "CLOSEWINDOW" */
  96.  
  97.            newwindow.IDCMPFlags    = CLOSEWINDOW    ; 
  98.  
  99.            newwindow.Flags    = WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE |
  100.                             SMART_REFRESH | NOCAREREFRESH ;
  101.  
  102.            newwindow.FirstGadget    = NULL    ; /* pas de gadget */
  103.            newwindow.CheckMark        = NULL    ;
  104.            newwindow.Title            = (UBYTE*) "NewLook"    ;
  105.            newwindow.Screen        = NULL    ; 
  106.            newwindow.BitMap        = NULL    ;
  107.            newwindow.MinWidth        = 100    ;
  108.            newwindow.MinHeight        = 10    ;
  109.            newwindow.MaxWidth        = ~0    ;
  110.           newwindow.MaxHeight        = ~0    ;
  111.            newwindow.Type            = WBENCHSCREEN    ;
  112.          /* la fenêtre s'ouvre sur Workbench */
  113.  
  114.  
  115.            if (window = OpenWindow((struct NewWindow*) &newwindow))
  116.            {
  117.         /* si la fenêtre est ouverte on attend le message de fermeture */
  118.  
  119.                    WaitPort(window->UserPort);
  120.                    while (msg = (struct IntuiMessage *)GetMsg(window->UserPort))
  121.                 ReplyMsg((struct Message *)msg);
  122.  
  123.         /* s'est terminé , on referme tout */
  124.  
  125.                    CloseWindow(window);
  126.                 
  127.            }
  128.             
  129.         Forbid();
  130.  
  131.         /* Remet en place la fonction OpenScreen d'origine */
  132.  
  133.         SetFunction((struct Library *)    IntuitionBase,(long)-198,oldopenscreen);        
  134.  
  135.         Permit();    
  136.  
  137.         CloseLibrary((struct Library *) IntuitionBase);
  138.     }
  139. }
  140.  
  141. /***********************************************************************/
  142.  
  143. /* Cette nouvelle fonction est appelée lorsque d0=OpenScreen(a0) est invoquée */
  144.  
  145. void newlookopenscreen()    
  146. {
  147. #asm
  148.     far code    ; cette fonction peut être appelée depuis n'importe où !!!
  149.     far data    ; il ne faut donc pas utiliser A4 pour pointer les données
  150.                 ; et le code .
  151.                 ; A5 pointe les varialeslocales .
  152. #endasm
  153.  
  154. struct NewScreen     *    newscreen    ;/*    -4(a5)  = adresse de *newscreen    */
  155. struct ExtNewScreen        xnewscreen    ;/*    -40(a5) = adresse de xnewscreen    */
  156. struct ExtNewScreen *    extnewscreen;/* -44(a5)  = adresse de *extnexscreen */
  157. struct TagItem            taglist[2]    ;
  158. struct TagItem        *   tags        ;
  159.  
  160. #asm
  161.  
  162.     move.l    a0,-4(a5)    ; A0 pointe une structure NewScreen ou ExtNewScreen
  163.     move.l    a0,-44(a5)
  164.                                 
  165. #endasm
  166.  
  167. /*  " NewLook " n'est préparé que si l'application ouvre un écran
  168.     " CUSTOMSCREEN " sans extension " TAGLIST "  
  169. */
  170.  
  171.  
  172.         if ( ((newscreen->Type) & (SCREENTYPE)) != WBENCHSCREEN ) 
  173.         {
  174.  
  175. /* sous system 2.0 un écran Custom a un aspect Newlook que s'il est ouvert */
  176. /*  avec les tags SA_Pens et dri_Pens                                      */
  177.  
  178.             taglist[0].ti_Tag = SA_Pens                ; 
  179.                taglist[0].ti_Data = (ULONG) dri_Pens    ;
  180.             taglist[1].ti_Tag = TAG_DONE            ;
  181.             
  182.             if ( ((newscreen->Type) & (NS_EXTENDED)) == 0 ) 
  183.             {
  184.             /* écran Custom sans extension */
  185.  
  186.  
  187. /* Recopie la structure NewScreen dans une structure ExtNewScreen */
  188.  
  189.                 xnewscreen.LeftEdge     = newscreen->LeftEdge        ;
  190.                 xnewscreen.TopEdge     = newscreen->TopEdge        ;
  191.  
  192.                 xnewscreen.Width     = newscreen->Width         ;
  193.  
  194.                 xnewscreen.Height     = newscreen->Height        ;
  195.  
  196.                 xnewscreen.Depth     = newscreen->Depth            ;
  197.                 xnewscreen.DetailPen = newscreen->DetailPen        ;
  198.                  xnewscreen.BlockPen     = newscreen->BlockPen        ;
  199.  
  200.                 xnewscreen.ViewModes = newscreen->ViewModes        ;
  201.  
  202.                 xnewscreen.Type         = newscreen->Type | NS_EXTENDED    ;
  203.  
  204. /* NS_EXTEND indique à OpenScreen() qu'on lui passe                 */
  205. /* une structure ExtNewScreen et non pas une structure NewScreen    */
  206.  
  207.                 xnewscreen.Font             = newscreen->Font                ;
  208.  
  209.                 xnewscreen.DefaultTitle    = newscreen->DefaultTitle        ;
  210.                 xnewscreen.Gadgets        = newscreen->Gadgets            ;
  211.                 xnewscreen.CustomBitMap = newscreen->CustomBitMap        ;
  212.  
  213. /* et maintenant l'extension de la structure NewScreen qui une " TagList " */
  214.  
  215.                 xnewscreen.Extension = taglist;
  216.  
  217. #asm
  218.                 lea        -40(a5),a0    ; => OpenScreen(&xnewscreen)
  219. #endasm
  220.             }
  221.             else
  222.  
  223.             {
  224.             BOOL pens    ;
  225.  
  226.                 /* écran Custom avec extension */
  227.                 /* examinons la Tag_list ...   */
  228.         
  229.                 pens = FALSE ;
  230.  
  231.                 tags = extnewscreen->Extension    ;
  232.  
  233.                 while( tags->ti_Tag != TAG_DONE ) 
  234.                 {
  235.  
  236.                 /* TAG_DONE marque la fin de la TagList    */
  237.  
  238.                     if ( tags->ti_Tag == SA_Pens )
  239.                     {
  240.                         pens = TRUE; /* driPens existent déjà */
  241.                     }
  242.                     tags++    ; 
  243.                 }
  244.  
  245.                 if ( !( pens ) )
  246.                 /* si driPens n'éxistent pas , on les rajoutent */
  247.                 {
  248.                     tags->ti_Tag    = TAG_MORE            ;
  249.                 /* TAG_MORE indique qu'il y a encore une taglist */
  250.  
  251.                     tags->ti_Data    = (ULONG) taglist    ;
  252.                 /* aprés TAG_MORE , ti_Data pointe sur la taglist */
  253.  
  254.                 }
  255. #asm
  256.                 move.l    -44(a5),a0    ; => OpenScreen(extnewscreen)
  257.                                     ; => ouverture de l'écran avec newlook
  258. #endasm
  259.   
  260.             }
  261.  
  262.         }
  263.         else
  264.         {
  265. #asm
  266.         move.l    -4(a5),a0    ; => OpenScreen(A0)
  267.                             ; => ouverture de l'écran sans rien modifier
  268. #endasm
  269.         }
  270.  
  271. #asm
  272.         move.l    _oldopenscreen,a1            
  273.         jsr        (a1)        ; Appel de la véritable "d0 = OpenScreen(a0)" 
  274. #endasm                
  275. }
  276.  
  277.  
  278.